importPackage(Packages.de.elo.ix.client);
//@include lib_Class.js
//@include lib_sol.common.RepoUtils.js
//@include lib_sol.common.SordUtils.js
//@include lib_sol.common.WfUtils.js
//@include lib_sol.common.ix.RfUtils.js
//@include lib_sol.common.ix.FunctionBase.js
var logger = sol.create("sol.Logger", { scope: "sol.common.ix.functions.Decide" });
/**
* Makes a decision on field values by regular expressions and sets the workflow status
*
* # Example
*
* {
* "checks": [
* { "type": "GRP", "key": "PROJECT_NO", "regex": "^AB(\\d+)$", "writeMatches": [{ "type": "GRP", "key": "COMPANY_NAME" }] },
* { "type": "GRP", "key": "PROJECT_NAME", "regex": "My(Project)", "writeMatches": [{ "type": "GRP", "key": "VENDOR_NAME" }] }
* ],
* "trueStatus": "TRUE",
* "falseStatus": "FALSE"
* }
*
* @author MW, ELO Digital Office GmbH
* @version 1.1
*
* @eloix
* @requires sol.common.WfUtils
* @requires sol.common.ix.RfUtils
* @requires sol.common.ix.FunctionBase
*
*/
sol.define("sol.common.ix.functions.Decide", {
extend: "sol.common.ix.FunctionBase",
requiredConfig: ["wfDiagram", "nodeId", "checks"],
/**
* @cfg {de.elo.ix.client.wfDiagram} wfDiagram (required)
* The workflow which should be checked.
*/
/**
* @cfg {String} [trueStatus=TRUE]
* Status value for ´true´
*/
/**
* @cfg {String} [falseStatus=FALSE]
* Status value for ´false´
*/
initialize: function (config) {
var me = this;
me.$super("sol.common.ix.FunctionBase", "initialize", [config]);
},
/**
* Perform the checks.
*/
process: function () {
var me = this,
decision, statusValue;
me.sord = ixConnect.ix().checkoutSord(me.wfDiagram.objId, SordC.mbAllIndex, LockC.NO);
decision = me.checkAndWrite();
me.trueStatus = me.trueStatus || "TRUE";
me.falseStatus = me.falseStatus || "FALSE";
statusValue = decision ? me.trueStatus : me.falseStatus;
sol.common.WfUtils.setWorkflowStatus(me.wfDiagram, statusValue);
},
checkAndWrite: function () {
var me = this,
updates = [],
result = true,
i, j, singleCheck, value, regExp, matches, match, mapEntries,
fieldDefIndex, fieldDefRef, fieldDef;
for (i = 0; i < me.checks.length; i++) {
singleCheck = me.checks[i];
if ((singleCheck.type == "WFMAP") && me.flowId) {
value = String(sol.common.WfUtils.getWfMapValue(me.flowId, singleCheck.key) || "");
} else {
value = String(sol.common.SordUtils.getValue(me.sord, singleCheck) || "");
}
if (!value && !(me.checkEmptyValues === true)) {
me.logger.debug(["Check: Field is emtpy: type={0}, key={1}", singleCheck.type, singleCheck.key]);
result = false;
break;
}
regExp = new RegExp(singleCheck.regex);
matches = value.match(regExp);
if (!matches || (matches.length == 0)) {
me.logger.debug(["Check: Field value doesn't match: type={0}, key={1}, value={2}, regex={3}", singleCheck.type, singleCheck.key, value, singleCheck.regex]);
result = false;
break;
}
if (singleCheck.writeMatches) {
for (j = 1; j < matches.length; j++) {
match = matches[j];
fieldDefIndex = j - 1;
fieldDefRef = singleCheck.writeMatches[fieldDefIndex];
if (fieldDefRef) {
fieldDef = sol.common.ObjectUtils.clone(fieldDefRef);
fieldDef.value = match;
me.logger.debug(["Write match to field: {0}", JSON.stringify(fieldDef)]);
updates.push(fieldDef);
}
}
}
}
if (updates.length > 0) {
mapEntries = sol.common.SordUtils.updateSord(me.sord, updates);
ixConnect.ix().checkinSord(me.sord, SordC.mbAllIndex, LockC.NO);
if (mapEntries) {
ixConnect.ix().checkinMap(MapDomainC.DOMAIN_SORD, me.sord.id, me.sord.id, mapEntries, LockC.NO);
}
}
me.logger.debug("Check: All fields match");
return result;
}
});
/**
* @member sol.common.ix.functions.Decide
* @static
* @inheritdoc sol.common.ix.FunctionBase#onExitNode
*/
function onExitNode(clInfo, userId, wfDiagram, nodeId) {
var params, module;
logger.enter("onExitNode_Decide", { flowId: wfDiagram.id, nodeId: nodeId });
params = sol.common.WfUtils.parseAndCheckParams(wfDiagram, nodeId);
params.wfDiagram = wfDiagram;
params.flowId = wfDiagram.id;
params.nodeId = nodeId;
module = sol.create("sol.common.ix.functions.Decide", params);
module.process();
logger.exit("onExitNode_Decide");
}